import { eachProp } from './Object';

/**
 * 将指定日期转译为指定格式，当格式中包含以下关键字时，会将其按以下规则替换，其他字符保留
 * 年份：Y ，Y个数代表从年份最后一位向前截取的位数，如：YYYY=2019，YY=19，位数不足则前面补零
 * 月份：M ，MM表示月份至少为2位数，前面不足补0，下同
 * 日子：D ，
 * 小时：H ，
 * 分钟：m ，
 * 秒：s ，
 * 毫秒：S ，只能出现一次，多余的不匹配，且根据当前毫秒数显示不同的位数（1-3）
 * @param date 指定日期
 * @param format 转换格式
 * @returns {string} 转换后的日期
 */
function formatDate(date: Date, format = 'YYYY-MM-DD HH:mm:ss') {
  let transDate = format;
  const schema: any = {
    'M+': date.getMonth() + 1,
    'D+': date.getDate(),
    'H+': date.getHours(),
    'm+': date.getMinutes(),
    's+': date.getSeconds(),
    'q+': Math.floor((date.getMonth() + 3) / 3),
    S: date.getMilliseconds(),
  };
  if (/(Y+)/.test(transDate)) {
    transDate = transDate.replace(RegExp.$1, (`${date.getFullYear()}`).substr(4 - RegExp.$1.length));
  }

  eachProp(schema, (el) => {
    if (new RegExp(`(${el})`).test(transDate)) {
      transDate = transDate.replace(RegExp.$1, (RegExp.$1.length === 1) ? (schema[el]) : ((`00${schema[el]}`).substr((`${schema[el]}`).length)));
    }
  });

  return transDate;
}

/**
 * 获取当前时间，并按指定格式输出位字符串
 * @param format 日期格式
 * @returns {string} 转换后的日期
 */
function now(format = 'YYYY-MM-DD HH:mm:ss') {
  const nowTime = new Date();
  return formatDate(nowTime, format);
}

export {
  formatDate,
  now,
};
